
/**
 * Clase que representa el problema del lobo y el granjero
 *
 */

package Problemas;

import Busquedas.Estado;

public class LoboColCabra extends Problema{
	
	private int LO;//lobo
	private int CO;//col
	private int CA;//cabra
	private int B;//barca
	
	/**
	 * Constructor de la clase
	 */
	public LoboColCabra(){
		int[] paramInicial={1,1,1,1};
		int[] paramObjetivo = {0,0,0,0};
		Estado inicial = new Estado(paramInicial);
		Estado [] objetivo = new Estado[1];
		objetivo[0] = new Estado(paramObjetivo);
		String [] nombresOperadores={"padre","cruzaLobo","cruzaCol","cruzaCabra","cruzaGranjero"};
		int [] costeOperadores={2,2,2,1};
		inicializa(inicial,objetivo,4,nombresOperadores,costeOperadores);
		
	}
	
	

	public void asignaParametros(Estado actual){
		LO = actual.getParametro(0);
		CO = actual.getParametro(1);
		CA = actual.getParametro(2);
		B = actual.getParametro(3);		
	}
	

	public Estado mueveLobo(Estado actual){
		asignaParametros(actual);
		if (LO == B){
			B = LO = (LO == 0) ? 1 : 0;
			int param[] = {LO,CO,CA,B};
			return new Estado(param);
		}
		return null;
	}
	
	

	public Estado mueveCol(Estado actual){
		asignaParametros(actual);
		if (CO == B){
			B = CO = (CO == 0) ? 1 : 0;
			int param[] = {LO,CO,CA,B};
			return new Estado(param);
		}
		return null;		
	}
	

	public Estado mueveCabra(Estado actual){
		asignaParametros(actual);
		if (CA == B){
			B = CA = (CA == 0) ? 1 : 0;
			int param[] = {LO,CO,CA,B};
			return new Estado(param);
		}
		return null;		
	}
	

	public Estado mueveGranjero(Estado actual){
		asignaParametros(actual);
		B = (B == 0) ? 1 : 0;
		int param[] = {LO,CO,CA,B};
		return new Estado(param);
	}
	
	

	public boolean peligro(Estado e){
		asignaParametros(e);
		return ((CA == LO ) && (B != CA)) || ((CA == CO) && (B != CA));
	}
	
	
	/* (non-Javadoc)
	 * @see Problema#getOperadorInverso(int)
	 */
	public int getOperadorInverso(int op){
		return op;
	}
	
	/* (non-Javadoc)
	 * @see Problema#aplicaOperador(Estado, int)
	 */
	public Estado aplicaOperador(Estado actual,int i){
		Estado siguiente = null;
		switch(i){
		case 0:
			siguiente = mueveLobo(actual);
			break;
		case 1:
			siguiente = mueveCol(actual);
			break;
		case 2:
			siguiente = mueveCabra(actual);
			break;
		case 3:
			siguiente = mueveGranjero(actual);
			break;
		}
		if ((siguiente!=null) && (peligro(siguiente))){
			return null;
		}
		return siguiente;
	}
	
        public int funcionHeuristica(Estado estado){
            asignaParametros(estado);
		return LO+CO+CA+B;
	}

}
